//
// Created by Xiaoyun on 23.3.25.
//
#include "c_queue.h"


/**
 *
 * @param Q : CQueue*
 */
void InitQueue(CQueue *Q) {
Q->front = Q->rear = Q->size = 0;
}

/**
 *
 * @param Q : CQueue
 * @return if succeed : bool
 */
bool QueueEmpty(CQueue Q) {
  if (Q.size == 0) return true;
  return false;
}

/**
 *
 * @param Q : CQueue
 * @return if succeed : bool
 */
bool QueueFull(CQueue Q) {
  if (Q.size == MaxSize) return true;
  return false;
}

/**
 *
 * @param Q : &CQueue*
 * @param x : ElemType
 * @return if succeed : bool
 */
bool EnQueue(CQueue *Q, ElemType x) {
if (QueueFull(*Q)) return false;
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % MaxSize;
Q->size++;
return true;
}

/**
 *
 * @param Q : CQueue*
 * @param x : ElemType*
 * @return if succeed : bool
 */
bool DeQueue(CQueue *Q, ElemType *x) {
if (QueueEmpty(*Q)) return false;
*x = Q->data[Q->front];
Q->front = (Q->front + 1) % MaxSize;
Q->size--;
return true;
}

/**
 *
 * @param Q : CQueue
 * @param x : ElemType*
 * @return if succeed : bool
 */
bool GetHead(CQueue Q, ElemType *x) {
if (QueueEmpty(Q)) {
return false;
}
*x = Q.data[Q.front];
return true;
}

/**
 *
 * @param Q : CQueue
 * @return size of Q : int
 */
int GetSize(CQueue Q) {
  return Q.size;
}